NeoComm
=======
NeoComm is a lightweight completely decentralized and anti-censorship IRC replacement network. The objective of this network is to create a secure form of group instant communication similar to IRC but decentralizing the network, and as a consequence hindering censorship within the network and protecting the network's endurance against malevolent entities that may try to block access to the network.

The API is C compatible (no C++ name mangling) despite the library itself being written in C++ (in order to work with OpenDHT). This should allow for simple bindings to be made, and rewriting the library to C++ should not be difficult either if someone would like to fork.

This repository provides a library with interfaces by which you can access the network, which you are able to use in your own software under the terms & conditions of the [library's license](#license).

 - [Network Model](#network-model)
 - [Roadmap](#roadmap)
 - [API Documentation](#api-documentation)
 - [Example Code](#example-code)
 - [Clients](#clients)
 - [Compiling](#compiling)
 - [Contributing](#contributing)
 - [License](#license)

Network Model
-------------
NeoComm tries to avoid any dependency on any central servers in order to avoid central control and censorship of the network itself. For this reason NeoComm works using a [DHT network](https://en.wikipedia.org/wiki/Distributed_hash_table), the technology used in torrenting to allow for nodes to aid each other in peer discovery. This means that the more you connect to the network the less reliant you are on any given node and that new users can connect to specific peer nodes if they are blocked to the default entry nodes. This is because the address of nodes from the previous session can be exported onto your hard disk and reused in later sessions, removing the need to rely on the default entry nodes.

Roadmap
-------
What follows is a list roadmap of features and the (approximate) versions in which they will be implemented. The API will only change in major versions of the library, while minor versions will be dedicated to internal improvements and patch versions to small fixes that got past the release.

 - v1.0-beta:
  - [x] Node connectivity
  - [x] Channel functionality (_TBT_)
  - [ ] Messages properly sent and received
 - v1.0:
  - [ ] Message encryption
  - [ ] P2P Private messages
 - v2.0:
  - [ ] SOCKS4a/SOCKS5 proxy support
  - [ ] HTTP proxy support
 - v3.0:
  - [ ] P2P File transfer
  - [ ] Memos (with TTL)

_TBT = To Be Tested_

API Documentation
-----------------
NeoComm uses [Doxygen](http://www.stack.nl/~dimitri/doxygen/) to generate its documentation (for NeoComm developers please refer to the [contributing section](#contributing)) which generates HTML documentation, which you can do by running `doxygen` in the root directory of the project or by using the graphical wizard.

Public documentation will be published with every major release.

Example Code
------------
In the [demo directory](demo/) there is example code of the project containing a minimal, working node using NeoComm. The program has the following usage: `./demo <local port> [<remote node address> <remote node port>]`.

Clients
-------
_There are currently no clients available._

Compiling
---------
To build this project you will need a C++11 compatible compiler ([GCC](https://gcc.gnu.org/) is recommended), the [OpenDHT library](https://github.com/savoirfairelinux/opendht) (`>= v1.4.0`), [msgpack-c](https://github.com/msgpack/msgpack-c), and the [CMake build system](https://cmake.org/). To build run the following commands from the root directory of the project.
```
$ cd build/
$ cmake ..
$ make
```

By default this will build a `release` build, if you require a debug build run the `cmake` command with the additional flag `-DCMAKE_BUILD_TYPE=debug`. It will also build a static library by default, in order to compile a dynamic library add the flag `-DBUILD_SHARED_LIB=ON`.

Contributing
------------
NeoComm is [Free/Libre Open Source Software (FLOSS)](https://www.gnu.org/philosophy/free-sw.html) and as such is community oriented. Contributions are greatly appreciated in order to keep the project up-to-date. If you would like to contribute something then please read over the [contribution guide](CONTRIBUTING.md) before making a pull request. If you're looking for something to contribute have a look at our issue tracker for bugs/requests.

License
-------
This project is licensed under the terms & conditions of the [GNU Affero General Public License version 3 or greater](LICENSE.md) unless stated otherwise in the file. The reasoning for using this license is that originally I wanted to use the LGPLv3+, however OpenDHT is licensed under the GPLv3 and therefore I had to choose either between the GPLv3 or the AGPLv3. My final decision was for the AGPLv3 because at least then if a legal institution finds a way using this framework to exploit the network (most likely via modifying the framework itself) then they will be forced to share the code and fixes can hopefully be made.
